import axios from "axios";
import store from "../store";

//设置基准地址
const baseURL = "http://pcapi-xiaotuxian-front-devtest.itheima.net";

// 创建一个新的axios对象只是没有取消请求和批量发请求的方法，其它所有语法都是一致的
// 需求:项目中有部分接口需要的配置与另一部分接口需要的配置不太一样
// 有自己特有的配置，分别应用到不同变求的接口请求中
// 需要用到token的实例
let instanceWithToken = axios.create({ baseURL });
// 不需要用到token的实例
let instanceWithoutToken = axios.create({ baseURL });

// 请求拦截器 —— 需要用到token的请求
instanceWithToken.interceptors.request.use((res) => {
  console.log("请求拦截器");
  let token = store.state.user.profile.token;
  if (token) {
    res.headers.Authorization = token;
    // console.log(res.headers);
  }

  return res;
});

// 响应拦截器 —— 需要用到token的请求
instanceWithToken.interceptors.response.use(
  ({ data }) => {
    return data;
  },
  (error) => {
    // console.log(error.response.status);
    // 未授权，既未登录或登录过期(token过期)
    if (error.response.status === 401) {
      store.commit("user/setuse", {});
      router
        .push("/login")
        .then(() => {
          alert("路由跳转成功");
        })
        .catch(() => {
          alert("路由跳转失败");
        });
    }
    // 返回一个带有拒绝原因的 Promise 对象。
    return Promise.reject(error.response);
  }
);

// 响应拦截器 —— 不需要用到token的请求
instanceWithoutToken.interceptors.response.use(({ data }) => {
  return data;
});

// 发起需要token请求函数
export function request(url, method, data) {
  return instanceWithToken(solveMiscellaneous(url, method, data));
}

export function requestWithToken(url, method, data) {
  return instanceWithoutToken(solveMiscellaneous(url, method, data));
}

// 解决请求数据函数中的冗杂代码
function solveMiscellaneous(url, method, data) {
  return {
    url,
    method,
    [method === "get" ? "params" : "data"]: data,
  };
}
